class Scheduler {
  constructor() {
    // 存放待执行任务的数组
    this.tasks = [];
    // 当前正在执行的任务
    this.concurrent = 0;
  }
  add(promiseCreator) {
    return new Promise(resolve => {
      // 将任务推入数组
      this.tasks.push(() => promiseCreator().then(resolve));
      this.runTask();
    });
  }
  runTask() {
    // 如果当前任务大于2 则不执行任务
    if (this.concurrent >= 2) return;
    let currentTask = this.tasks.shift();
    if (currentTask) {
      this.concurrent++;
      // 执行任务，定时时间到了之后，才会resolve 才会执行下面的then
      // 继续执行下一个任务
      currentTask().then(() => {
        // 待任务处理结束后，再加入新的任务处理
        this.concurrent -= 1;
        this.runTask();
      });
    }
  }
}
const timeout = timer => new Promise(resolve => setTimeout(resolve, timer));
const scheduler = new Scheduler();
const addTask = (time, order) => {
  scheduler.add(() => timeout(time)).then(() => {
    console.log(order);
  });
};

// output: 2 3 1 4


addTask(1000, "1");
addTask(500, "2");
addTask(300, "3");
addTask(400, "4");